home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / share / onboard / Keyboard.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-04-29  |  8.2 KB  |  280 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import gtk
  5. import Key
  6. import gobject
  7. import gconf
  8. import string
  9. from Key import *
  10. sidebarWidth = 60
  11.  
  12. try:
  13.     from utils import run_script
  14.     from utils import keysyms
  15. except DeprecationWarning:
  16.     pass
  17.  
  18.  
  19. class Keyboard(gtk.DrawingArea):
  20.     '''Cairo based keyboard widget'''
  21.     
  22.     def __init__(self, sok, basePane, panes):
  23.         gtk.DrawingArea.__init__(self)
  24.         self.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK)
  25.         self.connect('expose_event', self.expose)
  26.         self.connect('button_press_event', self.mouse_button_press)
  27.         self.connect('button_release_event', self.mouse_button_release)
  28.         self.connect('leave-notify-event', self.cb_leave_notify)
  29.         self.sok = sok
  30.         self.activePane = None
  31.         self.active = None
  32.         self.scanningActive = None
  33.         self.stuck = []
  34.         self.altLocked = False
  35.         self.tabKeys = []
  36.         self.basePane = basePane
  37.         self.panes = panes
  38.         self.tabKeys.append(BaseTabKey(self, sidebarWidth))
  39.         if self.panes:
  40.             for n in range(len(self.panes)):
  41.                 self.tabKeys.append(TabKey(self, sidebarWidth, self.panes[n]))
  42.             
  43.         
  44.         self.queue_draw()
  45.  
  46.     
  47.     def cb_leave_notify(self, widget, grabbed):
  48.         gtk.gdk.pointer_ungrab()
  49.         if self.active:
  50.             if self.scanningActive:
  51.                 self.active = None
  52.                 self.scanningActive = None
  53.             else:
  54.                 self.release_key(self.active)
  55.             self.queue_draw()
  56.         
  57.         return True
  58.  
  59.     
  60.     def utf8_to_unicode(self, utf8Char):
  61.         return ord(utf8Char.decode('utf-8'))
  62.  
  63.     
  64.     def scan_tick(self):
  65.         if self.scanningActive:
  66.             self.scanningActive.beingScanned = False
  67.         
  68.         if self.activePane:
  69.             pane = self.activePane
  70.         else:
  71.             pane = self.basePane
  72.         if not self.sok.scanningNoY == None:
  73.             self.sok.scanningNoY = (self.sok.scanningNoY + 1) % len(pane.columns[self.sok.scanningNoX])
  74.         else:
  75.             self.sok.scanningNoX = (self.sok.scanningNoX + 1) % len(pane.columns)
  76.         if self.sok.scanningNoY == None:
  77.             y = 0
  78.         else:
  79.             y = self.sok.scanningNoY
  80.         self.scanningActive = pane.columns[self.sok.scanningNoX][y]
  81.         self.scanningActive.beingScanned = True
  82.         self.queue_draw()
  83.         return True
  84.  
  85.     
  86.     def reset_scan(self):
  87.         if self.scanningActive:
  88.             self.scanningActive.beingScanned = False
  89.         
  90.         self.sok.scanningTimeId = None
  91.         self.sok.scanningNoX = None
  92.         self.sok.scanningNoY = None
  93.         self.queue_draw()
  94.  
  95.     
  96.     def mouse_button_press(self, widget, event):
  97.         gtk.gdk.pointer_grab(self.window, True)
  98.         if event.type == gtk.gdk.BUTTON_PRESS:
  99.             self.active = None
  100.             if self.sok.scanning and self.basePane.columns:
  101.                 if self.sok.scanningTimeId:
  102.                     if not self.sok.scanningNoY == None:
  103.                         self.press_key(self.scanningActive)
  104.                         gobject.source_remove(self.sok.scanningTimeId)
  105.                         self.reset_scan()
  106.                     else:
  107.                         self.sok.scanningNoY = -1
  108.                         gobject.source_remove(self.sok.scanningTimeId)
  109.                         self.sok.scanningTimeId = gobject.timeout_add(self.sok.scanningInterval, self.scan_tick)
  110.                 else:
  111.                     self.sok.scanningTimeId = gobject.timeout_add(self.sok.scanningInterval, self.scan_tick)
  112.                     self.sok.scanningNoX = -1
  113.             elif self.activePane:
  114.                 for key in self.activePane.keys.values():
  115.                     self.is_key_pressed(key, event)
  116.                 
  117.             else:
  118.                 for key in self.basePane.keys.values():
  119.                     self.is_key_pressed(key, event)
  120.                 
  121.             for key in self.tabKeys:
  122.                 self.is_key_pressed(key, event)
  123.             
  124.         
  125.         return True
  126.  
  127.     
  128.     def is_key_pressed(self, key, event):
  129.         if key.point_within_key(event.x, event.y):
  130.             self.press_key(key)
  131.         
  132.  
  133.     
  134.     def mouse_button_release(self, widget, event):
  135.         if self.active:
  136.             self.active.on = False
  137.             self.release_key(self.active)
  138.             if len(self.stuck) > 0:
  139.                 for stick in self.stuck:
  140.                     self.release_key(stick)
  141.                 
  142.                 self.stuck = []
  143.             
  144.             self.active = None
  145.         
  146.         self.queue_draw()
  147.         return True
  148.  
  149.     
  150.     def press_key(self, key):
  151.         if not key.on:
  152.             if self.sok.mods[8]:
  153.                 self.altLocked = True
  154.                 self.sok.vk.lock_mod(8)
  155.             
  156.             if key.sticky == True:
  157.                 self.stuck.append(key)
  158.             else:
  159.                 self.active = key
  160.             key.on = True
  161.             self.locked = []
  162.             if key.actions[0]:
  163.                 self.sok.vk.press_unicode(self.utf8_to_unicode(key.actions[0]))
  164.             elif key.actions[2]:
  165.                 self.sok.vk.press_keysym(keysyms[key.actions[2]])
  166.             elif key.actions[1]:
  167.                 self.sok.vk.press_keysym(key.actions[1])
  168.             elif key.actions[3]:
  169.                 mod = key.actions[3]
  170.                 if not mod == 8:
  171.                     self.sok.vk.lock_mod(mod)
  172.                 
  173.                 self.sok.mods[mod] += 1
  174.             elif key.actions[4]:
  175.                 
  176.                 try:
  177.                     mString = self.sok.macros[string.atoi(key.actions[4])]
  178.                     if mString:
  179.                         for c in mString:
  180.                             char = self.utf8_to_unicode(c)
  181.                             self.sok.vk.press_unicode(char)
  182.                             self.sok.vk.release_unicode(char)
  183.                         
  184.                         return None
  185.                 except IndexError:
  186.                     pass
  187.  
  188.                 dialog = gtk.Dialog('No snippet', self.sok.window, 0, ('_Save snippet', gtk.RESPONSE_OK, '_Cancel', gtk.RESPONSE_CANCEL))
  189.                 dialog.vbox.add(gtk.Label('No snippet for this button,\nType new snippet'))
  190.                 macroEntry = gtk.Entry()
  191.                 dialog.connect('response', self.cb_dialog_response, string.atoi(key.actions[4]), macroEntry)
  192.                 macroEntry.connect('activate', self.cb_macroEntry_activate, string.atoi(key.actions[4]), dialog)
  193.                 dialog.vbox.pack_end(macroEntry)
  194.                 dialog.show_all()
  195.             elif key.actions[5]:
  196.                 run_script(key.actions[5], self.sok)
  197.             else:
  198.                 for k in self.tabKeys:
  199.                     if k.pane == self.activePane:
  200.                         k.on = False
  201.                         k.stuckOn = False
  202.                         continue
  203.                 
  204.                 self.activePane = key.pane
  205.         elif key in self.stuck:
  206.             key.stuckOn = True
  207.             self.stuck.remove(key)
  208.         else:
  209.             key.stuckOn = False
  210.             self.release_key(key)
  211.         self.queue_draw()
  212.  
  213.     
  214.     def cb_dialog_response(self, widget, response, macroNo, macroEntry):
  215.         self.set_new_macro(macroNo, response, macroEntry, widget)
  216.  
  217.     
  218.     def cb_macroEntry_activate(self, widget, macroNo, dialog):
  219.         self.set_new_macro(macroNo, gtk.RESPONSE_OK, widget, dialog)
  220.  
  221.     
  222.     def set_new_macro(self, macroNo, response, macroEntry, dialog):
  223.         if response == gtk.RESPONSE_OK:
  224.             if macroNo > len(self.sok.macros) - 1:
  225.                 for n in range(macroNo + 1 - len(self.sok.macros)):
  226.                     self.sok.macros.append('')
  227.                 
  228.             
  229.             self.sok.macros[macroNo] = macroEntry.get_text()
  230.             self.sok.gconfClient.set_list('/apps/sok/macros', gconf.VALUE_STRING, self.sok.macros)
  231.         
  232.         dialog.destroy()
  233.  
  234.     
  235.     def release_key(self, key):
  236.         key.on = False
  237.         if key.actions[0]:
  238.             self.sok.vk.release_unicode(self.utf8_to_unicode(key.actions[0]))
  239.         elif key.actions[2]:
  240.             self.sok.vk.release_keysym(keysyms[key.actions[2]])
  241.         elif key.actions[1]:
  242.             self.sok.vk.release_keysym(key.actions[1])
  243.         elif key.actions[3]:
  244.             mod = key.actions[3]
  245.             if not mod == 8:
  246.                 self.sok.vk.unlock_mod(mod)
  247.             
  248.             self.sok.mods[mod] -= 1
  249.         elif key.actions[4] or key.actions[5]:
  250.             pass
  251.         else:
  252.             self.activePane = None
  253.         if self.altLocked:
  254.             self.altLocked = False
  255.             self.sok.vk.unlock_mod(8)
  256.         
  257.  
  258.     
  259.     def expose(self, widget, event):
  260.         context = widget.window.cairo_create()
  261.         context.set_line_width(1.1000000000000001)
  262.         size = self.get_allocation()
  263.         self.kbwidth = size.width - sidebarWidth
  264.         self.height = size.height
  265.         context.set_source_rgba(float(self.basePane.rgba[0]), float(self.basePane.rgba[1]), float(self.basePane.rgba[2]), float(self.basePane.rgba[3]))
  266.         context.paint()
  267.         self.basePane.paint(context, self.kbwidth, self.height)
  268.         if self.activePane:
  269.             context.rectangle(0, 0, self.kbwidth, self.height)
  270.             context.set_source_rgba(float(self.activePane.rgba[0]), float(self.activePane.rgba[1]), float(self.activePane.rgba[2]), float(self.activePane.rgba[3]))
  271.             context.fill()
  272.             self.activePane.paint(context, self.kbwidth, self.height)
  273.         
  274.         for key in self.tabKeys:
  275.             key.paint(context)
  276.         
  277.         return True
  278.  
  279.  
  280.